<html>
 <head>
  <meta charset="utf-8"/>
  <meta content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" name="viewport"/>
  <title>
   Hadoop On Yarn Mapreduce运行原理与常用数据压缩格式  | 数螺 | NAUT IDEA
  </title>
  <link href="http://cdn.bootcss.com/bootstrap/3.3.6/css/bootstrap-theme.min.css" rel="stylesheet"/>
  <link href="http://cdn.bootcss.com/bootstrap/3.3.6/css/bootstrap.min.css" rel="stylesheet"/>
  <style type="text/css">
   #xmain img {
                  max-width: 100%;
                  display: block;
                  margin-top: 10px;
                  margin-bottom: 10px;
                }

                #xmain p {
                    line-height:150%;
                    font-size: 16px;
                    margin-top: 20px;
                }

                #xmain h2 {
                    font-size: 24px;
                }

                #xmain h3 {
                    font-size: 20px;
                }

                #xmain h4 {
                    font-size: 18px;
                }


                .header {
	           background-color: #0099ff;
	           color: #ffffff;
	           margin-bottom: 20px;
	        }

	        .header p {
                  margin: 0px;
                  padding: 10px 0;
                  display: inline-block;  
                  vertical-align: middle;
                  font-size: 16px;
               }

               .header a {
                 color: white;
               }

              .header img {
                 height: 25px;
              }
  </style>
  <script src="http://cdn.bootcss.com/jquery/3.0.0/jquery.min.js">
  </script>
  <script src="http://nautstatic-10007657.file.myqcloud.com/static/css/readability.min.js" type="text/javascript">
  </script>
  <script type="text/javascript">
   $(document).ready(function() {
                 var loc = document.location;
                 var uri = {
                  spec: "http://dataunion.org/24569.html",
                  host: "http://dataunion.org",
                  prePath: "http://dataunion.org",
                  scheme: "http",
                  pathBase: "http://dataunion.org/"
                 };
    
                 var documentClone = document.cloneNode(true);
                 var article = new Readability(uri, documentClone).parse();
     
                 document.getElementById("xmain").innerHTML = article.content;
                });
  </script>
  <!-- 1466460722: Accept with keywords: (title(0.333333333333):社区,数盟,Hadoop,格式,原理,数据压缩, topn(0.3):社区,Hadoop,信息,格式文件,行业资讯,任务,查找,内存,缓冲区,过程,文件,配置文件,结果,记录,hadoop,文章,格式,排序,数据,节点,文件格式,字节,状态,数盟,磁盘,资源,编程语言,方法,线程,数据结构).-->
 </head>
 <body onload="">
  <div class="header">
   <div class="container">
    <div class="row">
     <div class="col-xs-6 col-sm-6 text-left">
      <a href="/databee">
       <img src="http://nautidea-10007657.cos.myqcloud.com/logo_white.png"/>
      </a>
      <a href="/databee">
       <p>
        数螺
       </p>
      </a>
     </div>
     <div class="hidden-xs col-sm-6 text-right">
      <p>
       致力于数据科学的推广和知识传播
      </p>
     </div>
    </div>
   </div>
  </div>
  <div class="container text-center">
   <h1>
    Hadoop On Yarn Mapreduce运行原理与常用数据压缩格式
   </h1>
  </div>
  <div class="container" id="xmain">
   ﻿﻿
   <title>
    Hadoop On Yarn Mapreduce运行原理与常用数据压缩格式 | 数盟社区
   </title>
   <!-- All in One SEO Pack 2.2.7.6.2 by Michael Torbert of Semper Fi Web Design[32,84] -->
   <!-- /all in one seo pack -->
   <!--
<div align="center">
<a href="http://strata.oreilly.com.cn/hadoop-big-data-cn?cmp=mp-data-confreg-home-stcn16_dataunion_pc" target="_blank"><img src="http://dataunion.org/wp-content/uploads/2016/05/stratabj.jpg"/ ></a>
</div>
-->
   <header id="header-web">
    <div class="header-main">
     <hgroup class="logo">
      <h1>
       <a href="http://dataunion.org/" rel="home" title="数盟社区">
        <img src="http://dataunion.org/wp-content/themes/yzipi/images/logo.png"/>
       </a>
      </h1>
     </hgroup>
     <!--logo-->
     <nav class="header-nav">
      <ul class="menu" id="menu-%e4%b8%bb%e8%8f%9c%e5%8d%95">
       <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-has-children menu-item-71" id="menu-item-71">
        <a href="http://dataunion.org/category/events" title="events">
         活动
        </a>
        <ul class="sub-menu">
         <li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-22457" id="menu-item-22457">
          <a href="http://dataunion.org/2016timeline">
           2016档期
          </a>
         </li>
         <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-22459" id="menu-item-22459">
          <a href="http://dataunion.org/category/parterc">
           合作会议
          </a>
         </li>
        </ul>
       </li>
       <li class="menu-item menu-item-type-taxonomy menu-item-object-category current-post-ancestor menu-item-has-children menu-item-20869" id="menu-item-20869">
        <a href="http://dataunion.org/category/tech" title="articles">
         文章
        </a>
        <ul class="sub-menu">
         <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-20867" id="menu-item-20867">
          <a href="http://dataunion.org/category/tech/base" title="base">
           基础架构
          </a>
         </li>
         <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-3302" id="menu-item-3302">
          <a href="http://dataunion.org/category/tech/ai" title="ai">
           人工智能
          </a>
         </li>
         <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-3303" id="menu-item-3303">
          <a href="http://dataunion.org/category/tech/analysis" title="analysis">
           数据分析
          </a>
         </li>
         <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-21920" id="menu-item-21920">
          <a href="http://dataunion.org/category/tech/dm">
           数据挖掘
          </a>
         </li>
         <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-3314" id="menu-item-3314">
          <a href="http://dataunion.org/category/tech/viz" title="viz">
           可视化
          </a>
         </li>
         <li class="menu-item menu-item-type-taxonomy menu-item-object-category current-post-ancestor current-menu-parent current-post-parent menu-item-3305" id="menu-item-3305">
          <a href="http://dataunion.org/category/tech/devl" title="devl">
           编程语言
          </a>
         </li>
        </ul>
       </li>
       <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-has-children menu-item-20876" id="menu-item-20876">
        <a href="http://dataunion.org/category/industry">
         行业
        </a>
        <ul class="sub-menu">
         <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-16328" id="menu-item-16328">
          <a href="http://dataunion.org/category/industry/case" title="case">
           行业应用
          </a>
         </li>
         <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-2112" id="menu-item-2112">
          <a href="http://dataunion.org/category/industry/demo" title="demo">
           Demo展示
          </a>
         </li>
         <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-21562" id="menu-item-21562">
          <a href="http://dataunion.org/category/industry/news">
           行业资讯
          </a>
         </li>
        </ul>
       </li>
       <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-311" id="menu-item-311">
        <a href="http://dataunion.org/category/sources" title="sources">
         资源
        </a>
       </li>
       <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-20870" id="menu-item-20870">
        <a href="http://dataunion.org/category/books" title="book">
         图书
        </a>
       </li>
       <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-21363" id="menu-item-21363">
        <a href="http://dataunion.org/category/training">
         课程
        </a>
       </li>
       <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-has-children menu-item-21853" id="menu-item-21853">
        <a href="http://dataunion.org/category/jobs">
         职位
        </a>
        <ul class="sub-menu">
         <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-22050" id="menu-item-22050">
          <a href="http://dataunion.org/category/career">
           职业规划
          </a>
         </li>
        </ul>
       </li>
      </ul>
     </nav>
     <!--header-nav-->
    </div>
   </header>
   <!--header-web-->
   <div id="main">
    <div id="soutab">
     <form action="http://dataunion.org/" class="search" method="get">
     </form>
    </div>
    <div id="container">
     <nav id="mbx">
      当前位置：
      <a href="http://dataunion.org">
       首页
      </a>
      &gt;
      <a href="http://dataunion.org/category/tech">
       文章
      </a>
      &gt;
      <a href="http://dataunion.org/category/tech/devl">
       编程语言
      </a>
      &gt;  正文
     </nav>
     <!--mbx-->
     <article class="content">
      <header align="centre" class="contenttitle">
       <div class="mscc">
        <h1 class="mscctitle">
         <a href="http://dataunion.org/24569.html">
          Hadoop On Yarn Mapreduce运行原理与常用数据压缩格式
         </a>
        </h1>
        <address class="msccaddress ">
         <em>
          482 次阅读 -
         </em>
         <a href="http://dataunion.org/category/tech/devl" rel="category tag">
          编程语言
         </a>
        </address>
       </div>
      </header>
      <div class="content-text">
       <p>
        <strong>
         作者：
        </strong>
        杨思义， 2015年6月毕业于山东大学齐鲁软件学院，工程硕士学位。2014年6月至2016年4月工作于北京亚信智慧数据科技有限公司 BDX大数据事业部，从2014年9月开始从事项目spark相关应用开发。
       </p>
       <p>
        个人博客地址：http://www.c
        <wbr>
        </wbr>
        nblogs.com/y
        <wbr>
        </wbr>
        angsy0915
       </p>
       <p>
        市面上的hadoop权威指南一类的都是老版本的书籍了，索性学习并翻译了并整理了下最新版的Hadoop:The Definitive Guide, 4th Edition与大家共同学习。
       </p>
       <p>
        我们通过提交jar包，进行MapReduce处理，那么整个运行过程分为五个环节：
       </p>
       <p>
        1、向client端提交MapReduce job.
       </p>
       <p>
        2、随后yarn的ResourceManager进行资源的分配.
       </p>
       <p>
        3、由NodeManager进行加载与监控containers.
       </p>
       <p>
        4、通过applicationMaster与ResourceManager进行资源的申请及状态的交互，由NodeManagers进行MapReduce运行时job的管理.
       </p>
       <p>
        5、通过hdfs进行job配置文件、jar包的各节点分发。
       </p>
       <p>
        <img src="http://mmbiz.qpic.cn/mmbiz/ymzg67DoLHLfCicFZX0cq49ILfsqwf4kHRsfMqEEPK6TkhgR3X3BKmpLCp3QjoIwg4U4oJ2bfT87VkRKgicQ26iaA/640?wx_fmt=png&amp;tp=webp&amp;wxfrom=5&amp;wx_lazy=1"/>
       </p>
       <p>
        <strong>
         Job 提交过程
        </strong>
       </p>
       <p>
        job的提交通过
        <strong>
         调用submit()方法
        </strong>
        创建一个
        <strong>
         JobSubmitter
        </strong>
        实例，并
        <strong>
         调用submitJobInternal()
        </strong>
        方法。整个job的运行过程如下：
       </p>
       <p>
        1、向ResourceManager申请application ID，此ID为该MapReduce的jobId。
       </p>
       <p>
        2、检查output的路径是否正确，是否已经被创建。
       </p>
       <p>
        3、计算input的splits。
       </p>
       <p>
        4、拷贝运行job 需要的jar包、配置文件以及计算input的split 到各个节点。
       </p>
       <p>
        5、在ResourceManager中调用submitAppliction()方法,执行job
       </p>
       <p>
        <strong>
         Job 初始化过程
        </strong>
       </p>
       <p>
        1、当resourceManager收到了submitApplication()方法的调用通知后，scheduler开始分配container,随之ResouceManager发送applicationMaster进程，告知每个nodeManager管理器。
       </p>
       <p>
        2、
        <strong>
         由applicationMaster决定
        </strong>
        如何运行tasks,如果job数据量比较小，applicationMaster便选择
        <strong>
         将tasks运行在一个JVM中
        </strong>
        。那么如何判别这个job是大是小呢？当一个job的
        <strong>
         mappers数量小于10个
        </strong>
        ，
        <strong>
         只有一个reducer或者读取的文件大小要小于一个HDFS block时
        </strong>
        ，（可通过修改配置项mapreduce.job.ubertask.maxmaps,mapreduce.job.ubertask.maxreduces以及mapreduce.job.ubertask.maxbytes 进行调整)
       </p>
       <p>
        3、在运行tasks之前，applicationMaster将会
        <strong>
         调用setupJob()方法
        </strong>
        ，随之创建output的输出路径(这就能够解释，不管你的mapreduce一开始是否报错，输出路径都会创建)
       </p>
       <p>
        <strong>
         Task 任务分配
        </strong>
       </p>
       <p>
        1、接下来applicationMaster向ResourceManager请求containers用于执行map与reduce的tasks（step 8),这里map task的优先级要高于reduce task，当所有的map tasks结束后，随之进行sort(这里是shuffle过程后面再说）,最后进行reduce task的开始。(这里有一点，当map tasks执行了百分之5%的时候，将会请求reduce，具体下面再总结)
       </p>
       <p>
        2、运行tasks的是需要消耗内存与CPU资源的，
        <strong>
         默认情况下，map和reduce的task资源分配为1024MB与一个核
        </strong>
        ，（可修改运行的最小与最大参数配置,mapreduce.map.memory.mb,mapreduce.reduce.memory.mb,mapreduce.map.cpu.vcores,mapreduce.reduce.reduce.cpu.vcores.)
       </p>
       <p>
        <strong>
         Task 任务执行
        </strong>
       </p>
       <p>
        1、这时一个task已经被ResourceManager分配到一个container中，由applicationMaster告知nodemanager启动container，这个task将会被一个
        <strong>
         主函数为YarnChild
        </strong>
        的java application运行，但在运行task之前，
        <strong>
         首先定位task需要的jar包、配置文件以及加载在缓存中的文件
        </strong>
        。
       </p>
       <p>
        2、YarnChild运行于一个专属的JVM中，所以
        <strong>
         任何一个map或reduce任务出现问题，都不会影响整个nodemanager的crash或者hang
        </strong>
        。
       </p>
       <p>
        3、每个task都可以在相同的JVM task中完成，随之将完成的处理数据写入临时文件中。
       </p>
       <p>
        Mapreduce数据流
       </p>
       <p>
        <strong>
         运行进度与状态更新
        </strong>
       </p>
       <p>
        1、MapReduce是一个较长运行时间的批处理过程，可以是一小时、几小时甚至几天，那么Job的运行状态监控就非常重要。每个job以及
        <strong>
         每个task都有一个包含job（running,successfully completed,failed）的状态
        </strong>
        ，以及value的计数器，状态信息及描述信息（描述信息一般都是在代码中加的打印信息），那么，这些信息是如何与客户端进行通信的呢？
       </p>
       <p>
        2、当一个task开始执行，它将会保持运行记录，记录task完成的比例，对于map的任务，将会记录其运行的百分比，对于reduce来说可能复杂点，但系统依旧会估计reduce的完成比例。当一个map或reduce任务执行时，
        <strong>
         子进程会持续每三秒钟与applicationMaster进行交互
        </strong>
        。
       </p>
       <p>
        <strong>
         Job 完成
        </strong>
       </p>
       <p>
        最终，applicationMaster会收到一个job完成的通知，随后改变job的状态为successful。最终，applicationMaster与task containers被清空。
       </p>
       <p>
       </p>
       <p>
        <strong>
         Shuffle与Sort
        </strong>
       </p>
       <p>
        从map到reduce的过程，被称之为shuffle过程，MapReduce使到reduce的数据一定是经过key的排序的，那么shuffle是如何运作的呢？
       </p>
       <p>
        当map任务将数据output时，
        <strong>
         不仅仅是将结果输出到磁盘，它是将其写入内存缓冲区域，并进行一些预分类
        </strong>
        。
       </p>
       <p>
        <img src="http://mmbiz.qpic.cn/mmbiz/ymzg67DoLHLfCicFZX0cq49ILfsqwf4kHQ5YeN0M4mNHBFBehUwTaqHZ5jDubuLKtiaQk9UT3IhBjibjBLPv1plpw/640?wx_fmt=png&amp;tp=webp&amp;wxfrom=5&amp;wx_lazy=1"/>
       </p>
       <p>
        <strong>
         1、The Map Side
        </strong>
       </p>
       <p>
        首先map任务的
        <strong>
         output过程是一个环状的内存缓冲区，缓冲区的大小默认为100MB
        </strong>
        （可通过修改配置项mpareduce.task.io.sort.mb进行修改），当写入内存的大小到达一定比例
        <strong>
         ，默认为80%
        </strong>
        （可通过mapreduce.map.sort.spill.percent配置项修改）,便开始写入磁盘。
       </p>
       <p>
        在写入磁盘之前，线程将会指定数据写入与reduce相应的patitions中，最终传送给reduce.在每个partition中
        <strong>
         ，后台线程将会在内存中进行Key的排序
        </strong>
        ，（
        <strong>
         如果代码中有combiner方法，则会在output时就进行sort排序
        </strong>
        ，这里，如果只有少于3个写入磁盘的文件，combiner将会在outputfile前启动，如果只有一个或两个，那么将不会调用）
       </p>
       <p>
        这里
        <strong>
         将map输出的结果进行压缩会大大减少磁盘IO与网络传输的开销
        </strong>
        （配置参数mapreduce.map .output.compress 设置为true,如果使用第三方压缩jar，可通过mapreduce.map.output.compress.codec进行设置)
       </p>
       <p>
        随后这些paritions输出文件将会通过HTTP发送至reducers，传送的最大启动线程通过mapreduce.shuffle.max.threads进行配置。
       </p>
       <p>
        <strong>
         2、The Reduce Side
        </strong>
       </p>
       <p>
        首先上面每个节点的map都将结果写入了本地磁盘中，现在reduce需要将map的结果通过集群拉取过来，这里要注意的是，
        <strong>
         需要等到所有map任务结束后,reduce才会对map的结果进行拷贝
        </strong>
        ，由于reduce函数有少数几个复制线程，以至于它
        <strong>
         可以同时拉取多个map的输出结果。默认的为5个线程
        </strong>
        （可通过修改配置mapreduce.reduce.shuffle.parallelcopies来修改其个数）
       </p>
       <p>
        这里有个问题，那么reducers怎么知道从哪些机器拉取数据呢？
       </p>
       <p>
        当所有map的任务结束后，
        <strong>
         applicationMaster通过心跳机制（heartbeat mechanism)，由它知道mapping的输出结果与机器host
        </strong>
        ,所以
        <strong>
         reducer会定时的通过一个线程访问applicationmaster请求map的输出结果
        </strong>
        。
       </p>
       <p>
        Map的结果将会被拷贝到reduce task的JVM的内存中（内存大小可在mapreduce.reduce.shuffle.input.buffer.percent中设置）如果不够用，则会写入磁盘。当内存缓冲区的大小到达一定比例时（可通过mapreduce.reduce.shuffle.merge.percent设置)或map的输出结果文件过多时（可通过配置mapreduce.reduce.merge.inmen.threshold)，将会除法合并(merged)随之写入磁盘。
       </p>
       <p>
        这时要注意，
        <strong>
         所有的map结果这时都是被压缩过的，需要先在内存中进行解压缩，以便后续合并它们
        </strong>
        。（合并最终文件的数量可通过mapreduce.task.io.sort.factor进行配置） 最终reduce进行运算进行输出。
       </p>
       <p>
       </p>
       <p>
       </p>
       <p>
       </p>
       <p>
        这里附带的整理了下Parquet存储结构与SequenceFile存储结构的特点
       </p>
       <p>
        <strong>
         Parquet
        </strong>
       </p>
       <p>
        Parquet是面向分析型业务的列式存储格式，由Twitter和Cloudera合作开发，2015年5月从Apache的孵化器里毕业成为Apache顶级项目，那么这里就总结下Parquet数据结构到底是什么样的呢？
       </p>
       <p>
        一个Parquet文件是
        <strong>
         由一个header以及一个或多个block块组成，以一个footer结尾
        </strong>
        。header中只包含一个4个字节的数字PAR1用来识别整个Parquet文件格式。文件中
        <strong>
         所有的metadata都存在于footer中
        </strong>
        。footer中的metadata包含了格式的版本信息，schema信息、key-value paris以及所有block中的metadata信息。footer中最后两个字段为一个以4个字节长度的footer的metadata,以及同header中包含的一样的PAR1。
       </p>
       <p>
        读取一个Parquet文件时，需要完全读取Footer的meatadata，Parquet格式文件不需要读取sync markers这样的标记分割查找，因为所有block的边界都存储于footer的metadata中(因为metadata的写入是在所有blocks块写入完成之后的，所以吸入操作包含的所有block的位置信息都是存在于内存直到文件close）
       </p>
       <p>
        这里注意，不像sequence files以及Avro数据格式文件的header以及sync markers是用来分割blocks。Parquet格式文件不需要sync markers，因此block的边界存储与footer的meatada中。
       </p>
       <p>
        <img src="http://mmbiz.qpic.cn/mmbiz/ymzg67DoLHLfCicFZX0cq49ILfsqwf4kH2O4LNZk8l9dBLAiaicDJz1Q6N6TrYiaFOBqEzicaz4SGuud3kYR91q1iatw/640?wx_fmt=png&amp;tp=webp&amp;wxfrom=5&amp;wx_lazy=1"/>
       </p>
       <p>
        在Parquet文件中，每一个block都具有一组Row group,她们是由一组Column chunk组成的列数据。继续往下，每一个column chunk中又包含了它具有的pages。每个page就包含了来自于相同列的值.Parquet同时使用更紧凑形式的编码，当写入Parquet文件时，它会自动基于column的类型适配一个合适的编码，比如，一个boolean形式的值将会被用于run-length encoding。
       </p>
       <p>
        另一方面，Parquet文件对于每个page支持标准的压缩算法比如支持Snappy,gzip以及LZO压缩格式，也支持不压缩。
       </p>
       <p>
       </p>
       <p>
        <strong>
         Parquet格式的数据类型：
        </strong>
       </p>
       <p>
        <img src="http://mmbiz.qpic.cn/mmbiz/ymzg67DoLHLfCicFZX0cq49ILfsqwf4kHkPfjLjpfLic2HzhVcNXYh4ZV5iaBAth2xBPiakEYjnBmYMUESNI48AiarA/640?wx_fmt=png&amp;tp=webp&amp;wxfrom=5&amp;wx_lazy=1"/>
       </p>
       <p>
        <strong>
         Hadoop SequenceFile
        </strong>
       </p>
       <p>
        在一些应用中，我们需要一种特殊的数据结构来存储数据，并进行读取，这里就分析下为什么用SequenceFile格式文件。
       </p>
       <p>
        Hadoop提供的SequenceFile文件格式提供一对key,value形式的不可变的数据结构。同时，HDFS和MapReduce job使用SequenceFile文件可以使文件的读取更加效率。
       </p>
       <p>
       </p>
       <p>
        <strong>
         SequenceFile的格式
        </strong>
       </p>
       <p>
        SequenceFile的格式是
        <strong>
         由一个header 跟随一个或多个记录组成
        </strong>
        。前三个字节是一个Bytes SEQ代表着版本号，同时header也包括key的名称，value class , 压缩细节，metadata，以及Sync markers。Sync markers的作用在于可以读取任意位置的数据。
       </p>
       <p>
        <img src="http://mmbiz.qpic.cn/mmbiz/ymzg67DoLHLfCicFZX0cq49ILfsqwf4kHLSZChJYmibicrXmEHfaeKQf83TzRicLCibibUVjNNPKyEueTh01YzjxjtPQ/640?wx_fmt=png&amp;tp=webp&amp;wxfrom=5&amp;wx_lazy=1"/>
       </p>
       <p>
        <strong>
         在recourds中
        </strong>
        ，又分为是否压缩格式。当没有被压缩时，key与value使用Serialization序列化写入SequenceFile。当选择压缩格式时，record的压缩格式与没有压缩其实不尽相同，除了value的bytes被压缩，key是不被压缩的。
       </p>
       <p>
        <strong>
         在Block中
        </strong>
        ，它使所有的信息进行压缩，压缩的最小大小由配置文件中，io.seqfile.compress.blocksize配置项决定。
       </p>
       <p>
        <strong>
         SequenceFile的MapFile
        </strong>
       </p>
       <p>
        一个MapFile可以通过SequenceFile的地址，进行分类查找的格式。使用这个格式的优点在于，首先会将SequenceFile中的地址都加载入内存，并且进行了key值排序，从而提供更快的数据查找。
       </p>
       <p>
        <strong>
         写SequenceFile文件:
        </strong>
       </p>
       <p>
        将key按100-1以IntWritable object进行倒叙写入sequence file,value为Text objects格式。在将key和value写入Sequence File前，首先将每行所在的位置写入(writer.getLength())
       </p>
       <p>
       </p>
       <p>
        import org.apache.hadoop.conf.Configuration;
        <br/>
        import org.apache.hadoop.fs.FileSystem;
        <br/>
        import org.apache.hadoop.fs.Path;
        <br/>
        import org.apache.hadoop.io.IOUtils;
        <br/>
        import org.apache.hadoop.io.IntWritable;
        <br/>
        import org.apache.hadoop.io.SequenceFile;
        <br/>
        import org.apache.hadoop.io.Text;
       </p>
       <p>
        import java.io.IOException;
        <br/>
        import java.net.URI;
       </p>
       <p>
        public class SequenceFileWriteDemo {
       </p>
       <p>
       </p>
       <p>
        private static final String[] DATA = {
       </p>
       <p>
        “One, two, buckle my shoe”,
       </p>
       <p>
        “Three, four, shut the door”,
       </p>
       <p>
        “Five, six, pick up sticks”,
       </p>
       <p>
        “Seven, eight, lay them straight”,
       </p>
       <p>
        “Nine, ten, a big fat hen”
       </p>
       <p>
        };
       </p>
       <p>
       </p>
       <p>
        public static void main(String[] args) throws IOException {
       </p>
       <p>
        String uri = args[0];
       </p>
       <p>
        Configuration conf = new Configuration();
       </p>
       <p>
        FileSystem fs = FileSystem.get(URI.create(uri), conf);
       </p>
       <p>
        Path path = new Path(uri);
       </p>
       <p>
       </p>
       <p>
        IntWritable key = new IntWritable();
       </p>
       <p>
        Text value = new Text();
       </p>
       <p>
        SequenceFile.Writer writer = null;
       </p>
       <p>
        try {
       </p>
       <p>
        writer = SequenceFile.createWriter(fs, conf, path,
       </p>
       <p>
        key.getClass(), value.getClass());
       </p>
       <p>
       </p>
       <p>
        for (int i = 0; i &lt; 100; i++) {
       </p>
       <p>
        key.set(100 – i);
       </p>
       <p>
        value.set(DATA[i % DATA.length]);
       </p>
       <p>
        System.out.printf(“[%s]\t%s\t%s\n”, writer.getLength(), key, value);
       </p>
       <p>
        writer.append(key, value);
       </p>
       <p>
        }
       </p>
       <p>
        } finally {
       </p>
       <p>
        IOUtils.closeStream(writer);
       </p>
       <p>
        }
       </p>
       <p>
        }
       </p>
       <p>
        }
       </p>
       <p>
       </p>
       <p>
        <strong>
         读取SequenceFile文件:
        </strong>
       </p>
       <p>
        首先需要创建SequenceFile.Reader实例，随后通过调用next()函数进行每行结果集的迭代(需要依赖序列化).
       </p>
       <p>
       </p>
       <p>
        import org.apache.hadoop.conf.Configuration;
        <br/>
        import org.apache.hadoop.fs.FileSystem;
        <br/>
        import org.apache.hadoop.fs.Path;
        <br/>
        import org.apache.hadoop.io.IOUtils;
        <br/>
        import org.apache.hadoop.io.SequenceFile;
        <br/>
        import org.apache.hadoop.io.Writable;
        <br/>
        import org.apache.hadoop.util.ReflectionUtils;
       </p>
       <p>
        import java.io.IOException;
        <br/>
        import java.net.URI;
       </p>
       <p>
        public class SequenceFileReadDemo {
       </p>
       <p>
       </p>
       <p>
        public static void main(String[] args) throws IOException {
       </p>
       <p>
        String uri = args[0];
       </p>
       <p>
        Configuration conf = new Configuration();
       </p>
       <p>
        FileSystem fs = FileSystem.get(URI.create(uri), conf);
       </p>
       <p>
        Path path = new Path(uri);
       </p>
       <p>
       </p>
       <p>
        SequenceFile.Reader reader = null;
       </p>
       <p>
        try {
       </p>
       <p>
        reader = new SequenceFile.Reader(fs, path, conf);
       </p>
       <p>
        Writable key = (Writable)
       </p>
       <p>
        ReflectionUtils.newInstance(reader.getKeyClass(), conf);
       </p>
       <p>
        Writable value = (Writable)
       </p>
       <p>
        ReflectionUtils.newInstance(reader.getValueClass(), conf);
       </p>
       <p>
        long position = reader.getPosition();
       </p>
       <p>
        while (reader.next(key, value)) {
        <br/>
        //同步记录的边界
       </p>
       <p>
        String syncSeen = reader.syncSeen() ? “*” : “”;
       </p>
       <p>
        System.out.printf(“[%s%s]\t%s\t%s\n”, position, syncSeen, key, value);
       </p>
       <p>
        position = reader.getPosition(); // beginning of next record
       </p>
       <p>
        }
       </p>
       <p>
        } finally {
       </p>
       <p>
        IOUtils.closeStream(reader);
       </p>
       <p>
        }
       </p>
       <p>
        }
       </p>
       <p>
        }
       </p>
       <p>
       </p>
       <p>
        <img src="http://mmbiz.qpic.cn/mmbiz/ymzg67DoLHLfCicFZX0cq49ILfsqwf4kHdHUKGcbKeJLAevNAOiauVVYfbqbhLlFspzKztxV2GMaFmxFp3X1Sa0A/640?wx_fmt=png&amp;tp=webp&amp;wxfrom=5&amp;wx_lazy=1"/>
        <br/>
        <img src="http://mmbiz.qpic.cn/mmbiz/ymzg67DoLHLfCicFZX0cq49ILfsqwf4kHTEUEYjpu64pJCCMcpotEv3JeWyrp7EBpnvxscCEyBkBFoGt0K0hQFA/640?wx_fmt=png&amp;tp=webp&amp;wxfrom=5&amp;wx_lazy=1"/>
       </p>
       <p>
        参考文献:《Hadoop:The Definitive Guide, 4th Edition》
       </p>
      </div>
      <div>
       <strong>
        注：转载文章均来自于公开网络，仅供学习使用，不会用于任何商业用途，如果侵犯到原作者的权益，请您与我们联系删除或者授权事宜，联系邮箱：contact@dataunion.org。转载数盟网站文章请注明原文章作者，否则产生的任何版权纠纷与数盟无关。
       </strong>
      </div>
      <!--content_text-->
      <div class="fenxian">
       <!-- JiaThis Button BEGIN -->
       <div class="jiathis_style_32x32">
        <p class="jiathis_button_weixin">
        </p>
        <p class="jiathis_button_tsina">
        </p>
        <p class="jiathis_button_qzone">
        </p>
        <p class="jiathis_button_cqq">
        </p>
        <p class="jiathis_button_tumblr">
        </p>
        <a class="jiathis jiathis_txt jtico jtico_jiathis" href="http://www.jiathis.com/share" target="_blank">
        </a>
        <p class="jiathis_counter_style">
        </p>
       </div>
       <!-- JiaThis Button END -->
      </div>
     </article>
     <!--content-->
     <!--相关文章-->
     <div class="xianguan">
      <div class="xianguantitle">
       相关文章！
      </div>
      <ul class="pic">
       <li>
        <a href="http://dataunion.org/24678.html">
         <img src="http://dataunion.org/wp-content/uploads/2016/06/20140917125452915416-216x200.jpg"/>
        </a>
        <a class="link" href="http://dataunion.org/24678.html" rel="bookmark" title="python3中的正则模块">
         python3中的正则模块
        </a>
       </li>
       <li>
        <a href="http://dataunion.org/24675.html">
         <img src="http://dataunion.org/wp-content/uploads/2016/06/t015b337bd75d9ef893-161x200.jpg"/>
        </a>
        <a class="link" href="http://dataunion.org/24675.html" rel="bookmark" title="注释是恶魔，请不要再写一行注释">
         注释是恶魔，请不要再写一行注释
        </a>
       </li>
       <li>
        <a href="http://dataunion.org/24660.html">
         <img src="http://dataunion.org/wp-content/uploads/2016/06/u16130037972892789947fm21gp0-300x157.jpg"/>
        </a>
        <a class="link" href="http://dataunion.org/24660.html" rel="bookmark" title="如何从Github上轻松安装R包">
         如何从Github上轻松安装R包
        </a>
       </li>
       <li>
        <a href="http://dataunion.org/24654.html">
         <img src="http://dataunion.org/wp-content/uploads/2016/06/df53fac99fc53ba5a90666abcca25e6d_b-267x200.png"/>
        </a>
        <a class="link" href="http://dataunion.org/24654.html" rel="bookmark" title="简单形象又有趣地说说强大的神经网络">
         简单形象又有趣地说说强大的神经网络
        </a>
       </li>
      </ul>
     </div>
     <!--相关文章-->
     <div class="comment" id="comments">
      <!-- You can start editing here. -->
      <!-- If comments are open, but there are no comments. -->
      <div class="title">
       期待你一针见血的评论，Come on！
      </div>
      <div id="respond">
       <p>
        不用想啦，马上
        <a href="http://dataunion.org/wp-login.php?redirect_to=http%3A%2F%2Fdataunion.org%2F24569.html">
         "登录"
        </a>
        发表自已的想法.
       </p>
      </div>
     </div>
     <!-- .nav-single -->
    </div>
    <!--Container End-->
    <aside id="sitebar">
     <div class="sitebar_list2">
      <div class="wptag">
       <span class="tagtitle">
        热门标签+
       </span>
       <div class="tagg">
        <ul class="menu" id="menu-%e5%8f%8b%e6%83%85%e9%93%be%e6%8e%a5">
         <li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-1605" id="menu-item-1605">
          <a href="http://taidizh.com/">
           泰迪智慧
          </a>
         </li>
         <li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-20884" id="menu-item-20884">
          <a href="http://www.transwarp.cn/">
           星环科技
          </a>
         </li>
         <li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-3538" id="menu-item-3538">
          <a href="http://datall.org/">
           珈和遥感
          </a>
         </li>
         <li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-20888" id="menu-item-20888">
          <a href="http://www.chinahadoop.cn/">
           小象学院
          </a>
         </li>
        </ul>
       </div>
      </div>
     </div>
     <div class="sitebar_list">
      <div class="textwidget">
       <div align="center">
        <a href="http://study.163.com/course/courseMain.htm?courseId=991022" target="_blank">
         <img src="http://dataunion.org/wp-content/uploads/2016/03/dv.jpg"/>
        </a>
       </div>
      </div>
     </div>
     <div class="sitebar_list">
      <h4 class="sitebar_title">
       文章分类
      </h4>
      <div class="tagcloud">
       <a class="tag-link-44" href="http://dataunion.org/category/industry/demo" style="font-size: 10.204724409449pt;" title="4个话题">
        Demo展示
       </a>
       <a class="tag-link-31" href="http://dataunion.org/category/experts" style="font-size: 15.826771653543pt;" title="52个话题">
        专家团队
       </a>
       <a class="tag-link-870" href="http://dataunion.org/category/tech/ai" style="font-size: 19.795275590551pt;" title="273个话题">
        人工智能
       </a>
       <a class="tag-link-488" href="http://dataunion.org/category/%e5%8a%a0%e5%85%a5%e6%95%b0%e7%9b%9f" style="font-size: 8pt;" title="1个话题">
        加入数盟
       </a>
       <a class="tag-link-869" href="http://dataunion.org/category/tech/viz" style="font-size: 17.204724409449pt;" title="93个话题">
        可视化
       </a>
       <a class="tag-link-30" href="http://dataunion.org/category/partners" style="font-size: 10.645669291339pt;" title="5个话题">
        合作伙伴
       </a>
       <a class="tag-link-889" href="http://dataunion.org/category/parterc" style="font-size: 11.582677165354pt;" title="8个话题">
        合作会议
       </a>
       <a class="tag-link-104" href="http://dataunion.org/category/books" style="font-size: 12.96062992126pt;" title="15个话题">
        图书
       </a>
       <a class="tag-link-220" href="http://dataunion.org/category/tech/base" style="font-size: 19.850393700787pt;" title="281个话题">
        基础架构
       </a>
       <a class="tag-link-219" href="http://dataunion.org/category/tech/analysis" style="font-size: 19.409448818898pt;" title="232个话题">
        数据分析
       </a>
       <a class="tag-link-887" href="http://dataunion.org/category/tech/dm" style="font-size: 13.291338582677pt;" title="17个话题">
        数据挖掘
       </a>
       <a class="tag-link-34" href="http://dataunion.org/category/tech" style="font-size: 20.732283464567pt;" title="404个话题">
        文章
       </a>
       <a class="tag-link-1" href="http://dataunion.org/category/uncategorized" style="font-size: 22pt;" title="693个话题">
        未分类
       </a>
       <a class="tag-link-4" href="http://dataunion.org/category/events" style="font-size: 14.503937007874pt;" title="29个话题">
        活动
       </a>
       <a class="tag-link-890" href="http://dataunion.org/category/tech/%e6%b7%b1%e5%ba%a6%e5%ad%a6%e4%b9%a0" style="font-size: 10.204724409449pt;" title="4个话题">
        深度学习
       </a>
       <a class="tag-link-221" href="http://dataunion.org/category/tech/devl" style="font-size: 18.968503937008pt;" title="193个话题">
        编程语言
       </a>
       <a class="tag-link-888" href="http://dataunion.org/category/career" style="font-size: 15.661417322835pt;" title="48个话题">
        职业规划
       </a>
       <a class="tag-link-5" href="http://dataunion.org/category/jobs" style="font-size: 14.11811023622pt;" title="25个话题">
        职位
       </a>
       <a class="tag-link-871" href="http://dataunion.org/category/industry" style="font-size: 15.716535433071pt;" title="49个话题">
        行业
       </a>
       <a class="tag-link-613" href="http://dataunion.org/category/industry/case" style="font-size: 16.984251968504pt;" title="84个话题">
        行业应用
       </a>
       <a class="tag-link-885" href="http://dataunion.org/category/industry/news" style="font-size: 17.425196850394pt;" title="102个话题">
        行业资讯
       </a>
       <a class="tag-link-10" href="http://dataunion.org/category/training" style="font-size: 14.228346456693pt;" title="26个话题">
        课程
       </a>
       <a class="tag-link-16" href="http://dataunion.org/category/sources" style="font-size: 15.661417322835pt;" title="48个话题">
        资源
       </a>
      </div>
     </div>
     <div class="sitebar_list">
      <h4 class="sitebar_title">
       功能
      </h4>
      <ul>
       <li>
        <a href="http://dataunion.org/wp-login.php?action=register">
         注册
        </a>
       </li>
       <li>
        <a href="http://dataunion.org/wp-login.php">
         登录
        </a>
       </li>
       <li>
        <a href="http://dataunion.org/feed">
         文章
         <abbr title="Really Simple Syndication">
          RSS
         </abbr>
        </a>
       </li>
       <li>
        <a href="http://dataunion.org/comments/feed">
         评论
         <abbr title="Really Simple Syndication">
          RSS
         </abbr>
        </a>
       </li>
       <li>
        <a href="https://cn.wordpress.org/" title="基于WordPress，一个优美、先进的个人信息发布平台。">
         WordPress.org
        </a>
       </li>
      </ul>
     </div>
    </aside>
    <div class="clear">
    </div>
   </div>
   <!--main-->
   ﻿
   <footer id="dibu">
    <div class="about">
     <div class="right">
      <ul class="menu" id="menu-%e5%ba%95%e9%83%a8%e8%8f%9c%e5%8d%95">
       <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-18024" id="menu-item-18024">
        <a href="http://dataunion.org/category/partners">
         合作伙伴
        </a>
       </li>
       <li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-20881" id="menu-item-20881">
        <a href="http://dataunion.org/contribute">
         文章投稿
        </a>
       </li>
       <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-20872" id="menu-item-20872">
        <a href="http://dataunion.org/category/%e5%8a%a0%e5%85%a5%e6%95%b0%e7%9b%9f">
         加入数盟
        </a>
       </li>
       <li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-22441" id="menu-item-22441">
        <a href="http://dataunion.org/f-links">
         友情链接
        </a>
       </li>
       <li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-20874" id="menu-item-20874">
        <a href="http://dataunion.org/aboutus">
         关于数盟
        </a>
       </li>
      </ul>
      <p class="banquan">
       数盟社区        ，
        做最棒的数据科学社区
      </p>
     </div>
     <div class="left">
      <ul class="bottomlist">
       <li>
        <a href="http://weibo.com/DataScientistUnion  " target="_blank" 　title="">
         <img src="http://dataunion.org/wp-content/themes/yzipi/images/weibo.png"/>
        </a>
       </li>
       <li>
        <a class="cd-popup-trigger" href="http://dataunion.org/24569.html#0">
         <img src="http://dataunion.org/wp-content/themes/yzipi/images/weixin.png"/>
        </a>
       </li>
      </ul>
      <div class="cd-popup">
       <div class="cd-popup-container">
        <h1>
         扫描二维码,加微信公众号
        </h1>
        <img src="http://dataunion.org/wp-content/themes/yzipi/images/2014-12-06-1515289049.png"/>
        <a class="cd-popup-close" href="http://dataunion.org/24569.html">
        </a>
       </div>
       <!-- cd-popup-container -->
      </div>
      <!-- cd-popup -->
     </div>
    </div>
    <!--about-->
    <div class="bottom">
     <a href="http://dataunion.org/">
      数盟社区
     </a>
     <a href="http://www.miitbeian.gov.cn/" rel="external nofollow" target="_blank">
      京ICP备14026740号
     </a>
     联系我们：
     <a href="mailto:contact@dataunion.org" target="_blank">
      contact@dataunion.org
     </a>
     <div class="tongji">
     </div>
     <!--bottom-->
     <div class="scroll" id="scroll" style="display:none;">
      ︿
     </div>
    </div>
   </footer>
   <!--dibu-->
  </div>
 </body>
</html>